/**
 * Classe ControleType : Permet de réaliser le controle de type pour les opérations unaires ou binaires
 * 
 * @author BlobbyCompiloTeam
 * 
 */

public class ControleType implements GramConstants {
	
	/**
	 * Effectue le contrôle de type pour une opération unaire : Vérifie que type est compatible avec l'opérateur op
	 * @param type Le type de l'opérande, type à vérifier selon l'opérande
	 * @param op Opérateur auquel va être soumis l'opérande
	 * @return boolean vrai si l'opération est autorisée, faux sinon
	 */
	public static boolean controleUnaire(int type,int op){
		boolean res = false;
		
		// non -> opérande booléen
		if(op == opNON && type == typeBool){
			res = true;
		// - -> opérande entier
		} else if(op == opMoins && type == typeEnt) {
			res = true;
		}
		
		return res;
	}
	
	
	/**
	 * Effectue le contrôle pour une opération binaire. Vérifie que type1 et type2 sont compatibles avec l'opérateur op
	 * @param type1 Le type de l'opérande 1 à vérifier
	 * @param type2 Le type de l'opérande 2 à vérifier
	 * @param op Opérateur auquel vont être soumis les opérandes 1 et 2
	 * @return boolean vrai si l'opération est autorisée, faux sinon
	 */
	public static boolean controleBinaire(int type1, int type2, int op){
		boolean res = false;
		
		switch(op){
			// +, -, *, /, <, >, <=, >= -> opérandes entiers
			case opPlus :
			case opMoins:
			case opMul:
			case opDiv:
			case opSup:
			case opInf:
			case opSupEg:
			case opInfEg:
				if(type1 == typeEnt && type2 == typeEnt){
					res = true;
				}
				break;
			
			// =, <> -> opérandes entiers ou booléens
			case opEg:
			case opDif:
				if(type1 == typeEnt && type2 == typeEnt){
					res = true;
				}else if(type1 == typeBool && type2 == typeBool){
					res = true;
				}
				break;
			
			// et, ou -> opérandes booléens
			case opET:
			case opOU:
				if(type1 == typeBool && type2 == typeBool){
					res = true;
				}
				break;
				
			default:
				break;
		}
		
		return res;
	}

}
